import { getUserToken } from '../../model/user'; // 假设用于获取全局用户数据
 
/**
 * 通用 API 请求函数
 * @param {string} url - 请求的接口地址
 * @param {string} method - 请求方法 (GET, POST, etc.)
 * @param {object} data - 请求数据 (POST/PUT)
 * @param {object} headers - 自定义请求头
 * @param {boolean} [useToken=true] - 是否需要传递 token，默认需要
 * @returns {Promise} - 返回一个 Promise，解析为接口响应数据
 */
const apiRequest = ({ url, method = 'GET', data = {}, headers = {}, useToken = true }) => {
  return new Promise((resolve, reject) => {
    let finalHeaders = {
      'Content-Type': 'application/json',
      ...headers,
    };
    // 如果需要 token，获取并添加到请求头
    if (useToken) {
      const token = getUserToken();
      if (token) {
        finalHeaders['Authorization'] = `Bearer ${token}`;
      }
    }

    // 发起请求
    wx.request({
      url,
      method,
      data,
      header: finalHeaders,
      success: (res) => {
        if (res.statusCode >= 200 && res.statusCode < 300) {
          resolve(res.data || []); 
        } else {
          reject(new Error(res.data?.message || `请求失败，状态码：${res.statusCode}`));
        }
      },
      fail: (err) => {
        reject(new Error('网络请求失败，请检查网络连接'));
      },
    });
  });
};

const apiUpload = ({ url, filePath, name = 'file', formData = {}, headers = {} }) => {
  return new Promise((resolve, reject) => {
    // 获取用户的 token
    const token = getUserToken();

    // 合并 headers
    const finalHeaders = {
      Authorization: `Bearer ${token}`,
      ...headers,
    };

    console.log('尝试使用 wx.uploadFile 上传，文件路径:', filePath);

    // 首先尝试使用 wx.uploadFile
    wx.uploadFile({
      url,
      filePath,
      name,
      formData,
      header: finalHeaders,
      success: (res) => {
        if (res.statusCode >= 200 && res.statusCode < 300) {
          try {
            const data = JSON.parse(res.data); // 尝试解析 JSON 响应
            resolve(data);
          } catch (error) {
            resolve(res.data); // 返回原始数据
          }
        } else {
          reject(new Error(`wx.uploadFile 上传失败，状态码：${res.statusCode}`));
        }
      },
      fail: async (err) => {
        console.warn('wx.uploadFile 失败，尝试使用 Base64 上传:', err);
      
        // 如果 wx.uploadFile 失败，记录详细日志
        console.log('上传失败的文件路径:', filePath);
        console.log('上传失败的目标 URL:', url);
        console.log('失败详细信息:', err);
      
        // 尝试使用 wx.request 上传
        try {
          const fileManager = wx.getFileSystemManager();
          console.log('开始异步读取文件:', filePath);
          try {
            console.log('验证文件路径是否存在:', filePath);
            fileManager.accessSync(filePath); // 检查路径是否存在
            console.log('文件路径存在，可以访问:', filePath);
          } catch (err) {
            console.error('文件路径不存在或无法访问:', err);
          }
          
          // 异步读取文件
          const fileData = await new Promise((resolve, reject) => {
            fileManager.readFile({
              filePath,
              success: (res) => {
                console.log('文件读取成功，文件大小:', res.data.byteLength);
                resolve(res.data);
              },
              fail: (readErr) => {
                console.error('读取文件失败:', readErr);
                reject(new Error(`读取文件失败: ${readErr.errMsg}`));
              },
            });
          });
        } catch (err) {
          console.error('Base64 上传最终失败:', err.message);
          reject(err);
        }
      },
    });
  });
};

module.exports = {
  apiRequest,
  apiUpload,
};
